#include <iostream>
#include <memory> //智能指针：能自动管理堆上对象的指针

// 内存寄放
class Test
{
public:
    Test()
    {
        std::cout << "构造函数\n";
    }

    ~Test()
    {
        std::cout << "析构函数\n";
    }

    void show()
    {
        std::cout << "show\n";
    }
};

int main()
{
    // 独占指针 unique_ptr 一个内存只能由一个内存进行管理
    // 把拷贝构造和=符号重载删除了
    // 除非必要，否则不允许拿裸指针，更不能释放裸指针
    // 裸指针不和智能指针混用
    // std::unique_ptr<Test> ptr = std::make_unique<Test>();
    // ptr->show();
    // return 0;

    //共享指针 shared_ptr
    // std::shared_ptr<Test>p1= std::make_shared<Test>();
    // //引用计数器，标志着还有几个指针指向这块内存
    // std::cout<<p1.use_count()<<std::endl;
    // std::shared_ptr<Test>p2= p1;
    // std::cout<<p1.use_count()<<std::endl;
    
    // std::shared_ptr<Test>p1= std::make_shared<Test>();
    // std::cout<<p1.use_count()<<std::endl;
    // std::shared_ptr<Test>p2= p1;
    // std::cout<<p2.use_count()<<std::endl;

    //弱指针 weak_ptr
    //用来解决循环指针无法释放的问题
    //容易出问题，所以类内推荐使用独占指针
    return 0;
}